//系统对文件处理方案
//在程序内实现fopen(filename,"w")之类的操作，系统会执行以下内容
#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<string.h>
#include<unistd.h>
#include<errno.h>


#define LOG "sys_file.txt"

int main()
{
  //int open(const char * pathname, int flags);
  //int open(const char * pathname, int flags, mode_t mode);
  //flags是int类型，也就是32个比特位。可以用一个比特位表示一个标志位，每一个标志位可以有不同的行为。这种方式叫做位图
  //mode用于描述文件权限
  //程序实现可看文件flag.c
  
  
  //int fd =open(LOG,O_CREAT|O_WRONLY);//如果使用这种方式创建文件，文件的背景将会是红色的，同时权限也与一般创建的权限不同。O_CREAT并不会对原有文件内容进行情况，而是直接覆盖，仍有可能保留一部分内容


  umask(0);//将掩码设置为0
  //O_CREAT|O_WRONLY如果使用这种方式创建文件，文件的背景将会是红色的，同时权限也与>    一般创建的权限不同。O_CREAT是当文件不存在时，创建该文件
  //int fd=open(LOG,O_CREAT|O_WRONLY,0666);
  
  int fd=open(LOG,O_WRONLY|O_CREAT|O_TRUNC,777);//解决权限问题，因此采用open函数的第二种方式，文件的权限还受umask影响。O_TRUNC就是为了清空原有内容。返回值fd为文件标识符
  //int fd=open(LOG,O_APPEND|O_CREAT,0666);这样只是追加，但是并不具有写入功能
  //int fd=open(LOG,O_WRONLY|O_APPEND|O_CREAT,0666);这样才是即追加又写入
  
  if(fd==-1)
  {
    printf("fd:%d,errno:%d,errstring:%s\n",fd,errno,strerror(errno));
  }
  else printf("fd:%d,errno:%d,errstring:%s\n",fd,errno,strerror(errno));


  //写
  const char *msg="this is sys test";
  int cnt=5;

  while(cnt)
  {
    char line[128];
    snprintf(line,sizeof(line),"%s,%d\n",msg,cnt);
    write(fd,line,strlen(line));//这里的strlen不需要+1，因为字符串结尾的\0是c语言的规定，并不是文件的规定
    cnt--;
  }


  //读。read不能指定按行读取，只能整体读取n个内容
  //ssize_t n=read(fd,buffer,sizeof(buffer)-1);//使用系统接口进行IO时，一定要考虑\0问题
  //if(n>0)
  //{
  //buffer[n]='\0';
  //printf("%s\n",buffer);
  //}




  close(fd);
 
  return 0;
}
